package estado;

import comunicacion.Cliente;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.util.logging.Level;
import java.util.logging.Logger;
import mensaje.*;
import servidor.GestorPartida;

/**
 * Responsabilidad: Implementar métodos para el estado EsperandoJugadores de recepción de mensajes
 * desde el cliente, desde la cola de entrada y envío de errores.
 */

public class EsperandoJugadores implements Estado{

    public Mensaje recibeDeSocket(ObjectInputStream objin, EstadoPartida estadoPartida, Cliente cliente){
        Object mensaje;
        MsjUnion mensajeUnion;
        try {
            mensaje = objin.readObject();
            if (mensaje instanceof MsjUnion){
                mensajeUnion = (MsjUnion) mensaje;
                return new MsjUnionJugador(mensajeUnion.getTipoPersonaje(), mensajeUnion.getNombre(), cliente);
            }else if(mensaje instanceof MsjFinPartida){
                System.out.println("El jugador "+((MsjFinPartida)mensaje).getId()+" se quiere ir!!");
                return (MsjFinPartida)mensaje;
            }else{
                System.out.println("Mensaje incorrecto para el estado, estado: EsperandoJugadores");
                return null;
            }
        } catch (IOException ex) {
            Logger.getLogger(EsperandoJugadores.class.getName()).log(Level.SEVERE, null, ex);
        } catch (ClassNotFoundException ex) {
            Logger.getLogger(EsperandoJugadores.class.getName()).log(Level.SEVERE, null, ex);
        }
        return null;
    }

    //¿no habria que enviar error con ACKUnion false? No. despues te explico, medio confuso si lo escribo. rata.
    public Mensaje enviarError(EstadoPartida estadoPartida){
       System.out.println("Por enviar error con MsjAckCrear false");
       MsjAckCrear mensajeAckCrear = new MsjAckCrear(false);
       return mensajeAckCrear;
   }

    public Object recibeDeCola(EstadoPartida estadoPartida, Mensaje mensaje, GestorPartida gestorPartida) {
        if (mensaje instanceof MsjUnionJugador){
            gestorPartida.agregarJugador(mensaje);
            return gestorPartida;
        }else if (mensaje instanceof MsjFinPartida){
            gestorPartida.eliminarJugador(((MsjFinPartida)mensaje).getId());
            return gestorPartida;
        }
        return gestorPartida;
    }
}
